package cn.growthgate.fgo.util;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.time.FastDateFormat;

/**
 * 日期时间工具类
 * 
 * @author GrowthGate
 * @since 2019年4月10日
 *
 */
public class DateUtils {

	/** yyyy-MM-dd HH:mm:ss */
	public static final String DEFAULT_DATETIME = "yyyy-MM-dd HH:mm:ss";
	/** yyyy年MM月dd日 HH时mm分ss秒 */
	public static final String CHINESE_DATETIME = "yyyy年MM月dd日 HH时mm分ss秒";
	/** yyyy-MM-dd HH:mm */
	public static final String DEFAULT_DATETIME_NO_SECOND = "yyyy-MM-dd HH:mm";
	/** yyyy年MM月dd日 HH时mm分 */
	public static final String CHINESE_DATETIME_NO_SECOND = "yyyy年MM月dd日 HH时mm分";
	/** yyyy-MM-dd */
	public static final String DEFAULT_DATE = "yyyy-MM-dd";
	/** yyyy年MM月dd日 */
	public static final String CHINESE_DATE = "yyyy年MM月dd日";
	/** HH:mm:ss */
	public static final String DEFAULT_TIME = "HH:mm:ss";
	/** HH时mm分ss秒 */
	public static final String CHINESE_TIME = "HH时mm分ss秒";
	/** HH:mm */
	public static final String DEFAULT_TIME_NO_SECOND = "HH:mm";
	/** HH时mm分 */
	public static final String CHINESE_TIME_NO_SECOND = "HH时mm分ss秒";

	/**
	 * 日期转时间
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static String toString(Date date, String pattern) {
		if (date == null) {
			return null;
		}
		return FastDateFormat.getInstance(pattern).format(date);
	}

	/**
	 * 时间转日期
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 * @throws ParseException
	 */
	public static Date toDate(String date, String pattern) throws ParseException {
		return FastDateFormat.getInstance(pattern).parse(date);
	}

	/**
	 * 将“开始日期 - 结束日期”字符串拆分为两个日期
	 * 
	 * @param dateStr
	 * @param pattern
	 * @return
	 * @throws ParseException
	 */
	public static Date[] split(String dateStr, String pattern) throws ParseException {
		String start = StringUtils.substringBefore(dateStr, " - ");
		String end = StringUtils.substringAfter(dateStr, " - ");
		return new Date[]{toDate(start, pattern), toDate(end, pattern)};
	}

	private static Date getStart(Date date, int field) {
		return org.apache.commons.lang3.time.DateUtils.truncate(date, field);
	}

	private static Date getEnd(Date date, int field) {
		Date tempDate = org.apache.commons.lang3.time.DateUtils.ceiling(date, field);
		return org.apache.commons.lang3.time.DateUtils.addMilliseconds(tempDate, -1);
	}

	/**
	 * 获取指定时间那一秒开始的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getSecondStart(Date date) {
		return getStart(date, Calendar.SECOND);
	}

	/**
	 * 获取指定时间那一秒结束的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getSecondEnd(Date date) {
		return getEnd(date, Calendar.SECOND);
	}

	/**
	 * 获取指定时间那一分钟开始的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getMinuteStart(Date date) {
		return getStart(date, Calendar.MINUTE);
	}

	/**
	 * 获取指定时间那一分钟结束的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getMinuteEnd(Date date) {
		return getEnd(date, Calendar.MINUTE);
	}

	/**
	 * 获取指定时间那一小时开始的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getHourStart(Date date) {
		return getStart(date, Calendar.HOUR_OF_DAY);
	}

	/**
	 * 获取指定时间那一小时结束的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getHourEnd(Date date) {
		return getEnd(date, Calendar.HOUR_OF_DAY);
	}

	/**
	 * 获取今天开始的时间
	 * @return
	 */
	public static Date getTodayStart() {
		return getDayStart(new Date());
	}

	/**
	 * 获取今天结束的时间
	 * @return
	 */
	public static Date getTodayEnd() {
		return getDayEnd(new Date());
	}

	/**
	 * 获取指定时间那一天开始的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getDayStart(Date date) {
		return getStart(date, Calendar.DAY_OF_MONTH);
	}

	/**
	 * 获取指定时间那一天结束的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getDayEnd(Date date) {
		return getEnd(date, Calendar.DAY_OF_MONTH);
	}

	/**
	 * 获取指定时间那一月开始的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getMonthStart(Date date) {
		return getStart(date, Calendar.MONTH);
	}

	/**
	 * 获取指定时间那一月结束的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getMonthEnd(Date date) {
		return getEnd(date, Calendar.MONTH);
	}

	/**
	 * 获取指定时间那一年开始的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getYearStart(Date date) {
		return getStart(date, Calendar.YEAR);
	}

	/**
	 * 获取指定时间那一月结束的时间
	 * 
	 * @param date
	 * @return
	 */
	public static Date getYearEnd(Date date) {
		return getEnd(date, Calendar.YEAR);
	}

	/**
	 * 获取两个日期相差的天数
	 * 
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static int getDiffDay(Date startDate, Date endDate) {
		return (int) ((endDate.getTime() - startDate.getTime()) / (60 * 60 * 24 * 1000));
	}

	/**
	 * 返回增加指定天数的日期
	 * 
	 * @param date
	 * @param amount
	 * @return
	 */
	public static Date addDays(Date date, int amount) {
		return org.apache.commons.lang3.time.DateUtils.addDays(date, amount);
	}

}
